/**
 * Copyright 2000 self.com.au
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License. (http://www.apache.org/licenses/LICENSE-2.0)
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed 
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for 
 * the specific language governing permissions and limitations under the License.
 *
 * <dhamma-message src="Atisha (11th century Tibetan Buddhist master)">
 * 	The greatest achievement is selflessness. The greatest worth is self-mastery.
 * 	The greatest quality is seeking to serve others. The greatest precept is continual awareness.
 * 	The greatest medicine is the emptiness of everything. The greatest action is not conforming with the worlds ways.
 * 	The greatest magic is transmuting the passions. The greatest generosity is non-attachment.
 * 	The greatest goodness is a peaceful mind. The greatest patience is humility.
 * 	The greatest effort is not concerned with results. The greatest meditation is a mind that lets go.
 * 	The greatest wisdom is seeing through appearances. 
 * </dhamma-message>
 *
 * @author Ashin Wimalajeewa
 */
package self.amigo.editor.tool;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import self.swing.*;
import self.gee.*;
import self.amigo.editor.*;
import self.amigo.elem.*;


public class LinkTool extends ACreationTool {
  private LinkView        main;
  private BasicLinkView   view;
  private boolean linkCompleted = true;
  private ILinkableGraphic sideA, sideB; 
  
  public LinkTool() {
    userInterfaceSink.putValue( Action.NAME, "Link" );
    Icon gif = IconUtils.getIconWithDescription("/self/amigo/images/Link.gif", "Link Tool");
    userInterfaceSink.putValue( Action.SMALL_ICON, gif );
  }
  
  public void mouseReleased(MouseEvent e) {
    if ( !linkCompleted ) {
      Point released = e.getPoint();
      IGraphicElement elem = controller.diagramLayer.getElementAtPoint( released, main );
      if ( !(elem instanceof ILinkableGraphic) ) {
        view.addPoint( released );
        return;
      }
      sideB = (ILinkableGraphic) elem;
      if ( (sideA == sideB) && (view.getNoOfPoints() == 2) ) {
        main.remove();
      } else {
        establishLinksToElements();
        editor.getSource().redraw();
      }
    }
    main = null;
    view = null;
    sideA = null;
    sideB = null;
    linkCompleted = true;
    super.mouseReleased( e );
  }
  
  public void mouseMoved(MouseEvent e) {
    if ( !linkCompleted ) {
      controller.diagramLayer.beginUpdate();
      view.setLastLocation( e.getX(), e.getY() );
      controller.diagramLayer.endUpdate();
    } 
  }
  
  protected LinkView constructLinkView() {
    return new LinkView();
  }
  
  protected IGraphicElement getCreatedElement() {
    return main;
  }
  
  protected void cancelElementCreation() {
    if ( main != null )
      main.remove();
    linkCompleted = true;
  }
  
  protected void createViewElement( MouseEvent e ) {
    if ( linkCompleted ) {
      IGraphicElement elem = controller.diagramLayer.getElementAtPoint( controller.touchDown );
      if ( !(elem instanceof ILinkableGraphic) ) 
        return;
      linkCompleted = false;
      main = constructLinkView();
      main.setLayer( controller.diagramLayer, true );
      view = main.getBasicLink();
      view.setLocation( controller.touchDown.x, controller.touchDown.y );
      view.setLastLocation( controller.touchDown.x, controller.touchDown.y );
      sideA = (ILinkableGraphic) elem;
    } 
  }
  
  protected void sizeCreatedViewElement( MouseEvent e ) {
    if ( !linkCompleted ) {
      controller.diagramLayer.beginUpdate();
      view.setLastLocation( e.getX(), e.getY() );
      controller.diagramLayer.endUpdate();
    } 
  }
  
  private void establishLinksToElements() {
    view.linkSideA( sideA );
    view.linkSideB( sideB );
 }
}
